package network;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;

public class UdpEchoServer {
    private DatagramSocket socket = null;

    // 构造方法
    public UdpEchoServer(int port) throws SocketException {
        socket = new DatagramSocket(port);
    }

    public void start() throws IOException {
        System.out.println("服务器启动");

        while(true){
            // 每次循环, 就是在处理一个请求-响应过程
            // 1. 读取请求并解析
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(requestPacket);
            // 读到的字节数组, 转成String 方便后续的逻辑处理
            String request = new String(requestPacket.getData(),0, requestPacket.getLength());
            // 2. 根据请求计算响应 (对于回显服务器来说, 这一步啥都不用做)
            String response = process(request);

            // 3. 把响应返回到客户端
            // 构造一个DatagramPacket作为响应对象
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(StandardCharsets.UTF_8),
                    response.getBytes().length,requestPacket.getSocketAddress()); // 该Packet 就不是空白的字节数组了, 把String 拿过来, 通过getBytes方法
            // 不要使用 response.length()
            // requestPacket.getSocketAddress() 可以得到一个INetAddress 对象, 这个对象包含 IP和端口号 (客户端)

            socket.send(responsePacket);

            // 打印日志
            System.out.printf("[%s:%d] req: %s, resp: %s\n", requestPacket.getAddress().toString(),
                    requestPacket.getPort(),request,response);
        }
    }


    public String process(String request) {
        return request;
    }

    public static void main(String[] args) throws IOException {
        UdpEchoServer Server = new UdpEchoServer(9000);
        Server.start();
    }
}
